package com.mililoan.common.utils;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

public class Tool {

	private static org.slf4j.Logger LOGGER = LoggerFactory.getLogger(Tool.class);

	public static String cutString(String title, String istop, int len) {
		if (title == null)
			return "";
		if (len < 5) // 过短的截取无法满足置顶的需要
			return title;

		byte a[] = title.getBytes();
		if ("1".equals(istop) || "2".equals(istop))
			len -= 4;

		if (a.length <= len)
			return title; // 无需截取
		else
			len -= 3; // 留出"..."的位置

		int i = 0, j = 0;
		boolean d = false;
		while (j < len) {
			if (a[j] < 0) {
				d = true;
				j++;
			} else {
				d = false;
			}
			j++;
		}
		if (d && j > len) {
			len -= 1;
		}

		// 复制输出串
		byte b[] = new byte[len + 3];
		i = 0;
		while (i < len) {
			b[i] = a[i];
			i++;
		}
		b[i++] = '.';
		b[i++] = '.';
		b[i++] = '.';
		return new String(b);
	}

	/**
	 * 取得当前时间:精确到秒
	 * 
	 * 时间转化格式，例如：yyyy-MM-dd HH:mm:ss 或者yyyy-mm-dd等
	 * 
	 * @return 格式化后的日期
	 */
	public static String getTime() {
		java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		java.util.Date date = new java.util.Date();
		String time = df.format(date);
		return time;
	}

	/**
	 * 取得当前时间
	 *
	 * @param p_format
	 *            时间转化格式，例如：yyyy-MM-dd HH:mm:ss 或者yyyy-mm-dd等
	 * @return 格式化后的日期
	 */
	public static String getCurrentTime(String p_format) {
		java.text.DateFormat df = new java.text.SimpleDateFormat(p_format);
		java.util.Date date = new java.util.Date();
		String time = df.format(date);
		return time;
	}

	/**
	 * 取得当前时间:精确到日
	 * 
	 * 时间转化格式，例如：yyyy-MM-dd HH:mm:ss 或者yyyy-mm-dd等
	 * 
	 * @return 格式化后的日期
	 */
	public static String getDate() {
		java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd");
		java.util.Date date = new java.util.Date();
		String time = df.format(date);
		return time;
	}

	/**
	 * 取得昨天的日期:精确到日
	 */
	public static String getYestoday() {
		// 一天的毫秒数
		long oneDayMills = 24 * 60 * 60 * 1000;
		// 昨天的事件戳
		long yesMill = System.currentTimeMillis() - oneDayMills;
		java.util.Date date = new java.util.Date(yesMill);
		java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd");
		String time = df.format(date);
		return time;
	}

	/**
	 * 获取当前的时间
	 *
	 * @param format
	 *            需要的时间格式
	 * @return
	 */
	public static String getDateOfToday(String format) {
		Date date = new Date();
		DateFormat sf = new SimpleDateFormat(format);
		String dir = sf.format(date);
		return dir;
	}

	/**
	 * 取得当前时间
	 * 
	 * @param p_format
	 *            时间转化格式，例如：yyyy-MM-dd HH:mm:ss 或者yyyy-mm-dd等
	 * @return 格式化后的日期
	 */
	public static String getTimeByFormat(String p_format) {
		java.text.DateFormat df = new java.text.SimpleDateFormat(p_format);
		java.util.Date date = new java.util.Date();
		String time = df.format(date);
		return time;
	}

	/**
	 * 字符串的中文化
	 * 
	 * @param p_sourceString
	 *            原字符
	 * @return 中文字符
	 */
	public static String toChinese(String p_sourceString) {

		// null的处理
		if (p_sourceString == null) {
			return "";
		} else {
			String _result = "";
			try {
				_result = new String(p_sourceString.getBytes("iso8859-1"));
			} catch (UnsupportedEncodingException e) {
				// 字符串的中文化异常

			}
			return _result;
		}
	}

	public static String createNewFileName(String p_filePostfix) {
		// 获取当前时间做为文件名
		String l_curTime = Tool.getDateOfToday("yyyyMMddHHmmss");
		//
		String l_newfilename = l_curTime + "." + p_filePostfix;

		return l_newfilename;
	}

	public static boolean shell(String cmd, int timeout) {
		boolean ret = false;
		try {
			LOGGER.info("开始执行文件比较" + cmd);
			Process child = Runtime.getRuntime().exec(cmd, new String[] {});
			int passtime = timeout / 200;
			boolean isEnd = false;
			while (passtime >= 0 && !isEnd) {
				try {
					if (child.exitValue() == 0) {
						ret = true;
						isEnd = true;
					}
				} catch (IllegalThreadStateException e) {
				}
				passtime--;
				LOGGER.info("等待sheel:" + passtime);
				Thread.sleep(200);
			}
			if (!isEnd) {
				LOGGER.warn("文件比较超时！");
			} else {
				if (child.exitValue() == 0)
					ret = true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ret;
	}

	/**
	 * md5加密
	 * 
	 * @since hozen 2014-6-26
	 * @param plainText
	 *            加密对象
	 * @param num
	 *            16: 返回16位加密 32：返回32位加密
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static String Md5(String plainText, int num) throws NoSuchAlgorithmException {
		MessageDigest md = MessageDigest.getInstance("MD5");
		md.update(plainText.getBytes());
		byte b[] = md.digest();
		int i;
		StringBuffer buf = new StringBuffer("");
		for (int offset = 0; offset < b.length; offset++) {
			i = b[offset];
			if (i < 0)
				i += 256;
			if (i < 16)
				buf.append("0");
			buf.append(Integer.toHexString(i));
		}

		if (num == 32) {
			return buf.toString();
		} else {
			return buf.toString().substring(8, 24);
		}

	}

	/**
	 * plainText: 加密对象 返回16位加密
	 */
	public static String Md5(String plainText) throws NoSuchAlgorithmException {
		return Md5(plainText, 16);
	}

	/**
	 * 获得指定格式的String类型的日期, 默认格式，yyyy-MM-dd,如：2000-05-30 type参数，请使用本类定义的静态变量来赋值
	 */
	public static String formatDate(Date date, String format) {
		String result = null;

		SimpleDateFormat formatter = new SimpleDateFormat(format);

		if (date != null) {
			result = formatter.format(date);
		} else {
			result = "";
		}

		return result;
	}

	public static String formatDate(Date date) {
		if (date == null)
			return null;
		String fmt = "yyyy-MM-dd HH:mm:ss";
		return formatDate(date, fmt);
	}

	/**
	 * 身份证号查性别
	 * 
	 * @param pid
	 * @return
	 */
	public static int sexOfPid(String pid) {
		pid = pid.trim();
		if (pid == null || (pid.length() != 15 && pid.length() != 18)) {
			return -1;
		}
		if (pid.length() == 15 || pid.length() == 18) {
			String lastValue = pid.substring(pid.length() - 1, pid.length());
			int sex;
			if (lastValue.trim().toLowerCase().equals("x") || lastValue.trim().toLowerCase().equals("e")) {
				// return "先生";
				return 1;
			} else {
				sex = Integer.parseInt(lastValue) % 2;
				// return sex == 0 ? "女士" : "先生";
				return sex;
			}
		} else {
			return -1;
		}
	}

	/**
	 * 根据身份证号生成出生日期
	 * 
	 * @since hozen 2014-6-26
	 * @param pid
	 *            15位或18位的身份证号
	 * @return
	 */
	public static String birthdayOfPid(String pid) {
		String returnDate = null;
		StringBuffer tempStr = null;
		if (pid != null && pid.trim().length() > 0) {
			if (pid.trim().length() == 15) {
				tempStr = new StringBuffer(pid.substring(6, 12));
				tempStr.append("日");
				tempStr.insert(4, "月");
				tempStr.insert(2, "年");
				tempStr.insert(0, "19");
			} else if (pid.trim().length() == 18) {
				tempStr = new StringBuffer(pid.substring(6, 14));
				tempStr.append("日");
				tempStr.insert(6, "月");
				tempStr.insert(4, "年");
			}
		}
		if (tempStr != null && tempStr.toString().trim().length() > 0) {
			returnDate = tempStr.toString();

		}
		return returnDate;
	}

	public static String insertString(String origin, String split) {
		String target = "";
		if (!StringUtils.isEmpty(origin)) {
			String[] origins = origin.split(split);
			for (int i = 0; i < origins.length; i++) {
				if (StringUtils.isEmpty(target)) {
					target = "'" + origins[i] + "'";
				} else {
					target += split + "'" + origins[i] + "'";
				}
			}
		}
		return target;
	}

	/**
	 * 
	 * @Title: isNullLong
	 * @Description: Long型是否为空
	 * @author YangChaofeng 2016年8月30日 下午4:04:50
	 * @param l
	 * @return
	 */
	public static boolean isNullLong(Long l) {
		return null != l && -100l != l;
	}

	/**
	 * 手机号验证
	 *
	 * @param str
	 * @return 验证通过返回true
	 */
	public static boolean isMobile(String str) {
		Pattern p = null;
		Matcher m = null;
		boolean b = false;
		p = Pattern.compile("^[1][3,4,5,8][0-9]{9}$"); // 验证手机号
		m = p.matcher(str);
		b = m.matches();
		return b;
	}
	
	/**
	 * 解析对象为LONG
	 * @param obj
	 * @return
	 */
	public static Long parseLong(Object obj){
		if(null == obj){
			return new Long(0);
		}
		try{
			return Long.parseLong(obj.toString());
		} catch(Exception e) {
			return new Long(0);
		}
		//正则表达式 校验字符串是否为数字
//		Pattern pattern = Pattern.compile("[0-9]*");
//        Matcher isNum = pattern.matcher(obj.toString());
//        if( !isNum.matches() ){
//            return new Long(0);
//        } else {
//        	return Long.parseLong(obj.toString());
//        }
	}
	/**
	 * 解析对象为Float
	 * @param obj
	 * @return
	 */
	public static Double parseDouble(Object obj){
		if(null == obj){
			return new Double(0);
		}
		//正则表达式 校验字符串是否为数字
		Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(obj.toString());
        if( !isNum.matches() ){
            return new Double(0);
        } else {
        	return Double.parseDouble(obj.toString());
        }
	}
	/**
	 * 获得UUID
	 */
	public static String getUUID() {
		Long uuid = UUID.randomUUID().getMostSignificantBits();
		if (uuid < 0) {
			uuid = -1 * uuid;
		}
		return uuid.toString();
	}
	
	public static String getStr(Object o) {
		if (o == null) {
			return "";
		}
		String str = "";
		if (o instanceof String) {
			str = (String) o;
		} else {
			str = o.toString();
		}
		return str;
	}
	
	public static String getStr(Object o, String defaultValue){
		if (o == null) {
			return defaultValue;
		}
		String str = defaultValue;
		if (o instanceof String) {
			str = (String) o;
		} else {
			str = o.toString();
		}
		if(str.length()==0){
			str = defaultValue;
		}
		return str;
	}
}
